package com.zq.blog_serve.aop;


import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONReader;
import com.alibaba.fastjson2.JSONWriter;
import com.alibaba.fastjson2.filter.Filter;
import com.zq.blog_serve.constant.Constants;
import com.zq.blog_serve.entity.SysUser;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

// @Component // 将对象交由spring进行管理
// @Aspect
@Slf4j
public class ControllerAop {

    // @Pointcut("execution(public * com.zq.blog_serve.controller..*.*(..))") // 切入点表达式
    public void privilege() {
    }

    // @Around("privilege()")
    public Object around(ProceedingJoinPoint pjd) throws Throwable {
        // 获取方法名
        String className = pjd.getSignature().getClass().getName();
        // 获取执行的方法名称
        String methodName = pjd.getSignature().getName();
        /** 初始化日志打印 */
        // 定义返回参数
        Object result = null;
        // 记录开始时间
        long start = System.currentTimeMillis();
        // 获取方法参数
        Object[] args = pjd.getArgs();
        String params = "前端请求参数为:";
        // 获取请求参数集合并进行遍历拼接
        for (Object object : args) {
            params += object.toString() + ",";
        }
        params = params.substring(0, params.length() - 1);
        // 打印请求参数参数
        log.info(className + "类的" + methodName + "的请求参数:【{}】", JSON.toJSONString(params));
        // 执行目标方法
        result = pjd.proceed();
        // 打印返回报文
        log.info(className + "类的" + methodName + "的" + "方法返回报文为:【{}】", JSON.toJSONString(result));
        // 获取执行完的时间
        log.info(className + "类的" + methodName + "的" + "方法执行时长为:" + (System.currentTimeMillis() - start));
        return result;
    }
}
